package com.erp.erp_servers.Bpmn;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.task.Task;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @ClassName IBpmnService
 * @Description 工作流接口
 * @Author songjizhen
 * @Date 2020-07-26 12:46
 * @Version 1.0
 */
public interface IBpmnService {
    /**
     * 流程部署
     * @param bpmname  流程设计文件名（*.bpmn）
     *@param  delpoyname 部署名称
     */
    Deployment deployProcess(String bpmname,String delpoyname);

    /**
     * 查询流程定义
     * @param deploymentId 使用部署对象ID查询
     * @param processDefinitionId 使用流程定义ID查询
     * @param processDefinitionKey 使用流程定义的key查询
     * @param processDefinitionNameLike 使用流程定义的名称模糊查询
     * @param count 返回结果集数量
     * 以上5个参数为互斥参数，只能有
     * 以下两个参数用用分页，可与processDefinitionNameLike联合使用
     * @param firstResult 开始条数
     * @param maxResults 截止条数
     * @return
     */
    Object findProcessDefinition(String deploymentId,String processDefinitionId,String processDefinitionKey,String processDefinitionNameLike
            ,Boolean count,int firstResult, int maxResults);

    /**
     * 根据流程部署ID，删除流程定义
     * @param deploymentId
     */
    Boolean deleteProcessDefinition(String deploymentId);

    /**
     * 查看流程图
     * @param deploymentId
     * @param response
     */
    Boolean viewPic(String deploymentId, HttpServletResponse response) throws IOException;

    /**
     * 根据流程定义的key（即流程图中的id）启动流程
     * @param processDefinitionKey 流程ID
     * @param map 流程参数
    背后影响的表:
     *      act_hi_actinst: 已完成的活动信息
     *      act_hi_identitylink: 参与者信息
     *      act_hi_procinst: 流程实例
     *      act_hi_taskinst: 任务实例
     *      act_ru_execution: 执行表
     *      act_ru_identitylink: 参与者信息
     *      act_ru_task: 任务
     * @return
     */
    ProcessInstance startProcessInstance(String processDefinitionKey, Map<String, Object> map);

    /**
     * 查询个人待办事项
     * @param userCode
     * @return
     */
    List<Task>  findPersonalTask(String userCode);

    /**
     * 查询已办
     * @param userCode
     * @return
     */
    List<HistoricTaskInstance>  findHistoryTash(String userCode,int firstResult, int maxResults);

    /**
     * 任务处理
     * @param taskId
     */
   Boolean completePersonalTask(String taskId,Map<String, Object> variables,String activityId) throws Exception;

    /**
     * 根据流程实例id查询流程状态,判断流程走到哪一个节点
     * @param processInstanceId
     * @return
     */
    ProcessInstance isProcessActive(String processInstanceId );

    /**
     * 根据流程实例id查询历史信息
     * @param processInstanceId
     * @return
     */
    List<HistoricTaskInstance>  findHistoryTaskByPID(String processInstanceId);

    /**
     * 中止流程
     * @param taskId
     * @return
     */
    Boolean endProcess(String taskId) throws Exception;

    /**
     * 根据当前任务ID，查询可以驳回的任务节点
     * @param taskId
     * @return
     */
    List<ActivityImpl> findBackAvtivity(String taskId) throws Exception;
}
